<?php

/*****************************************************
 * Create date: 2019/10/11
 * Description: 协程redis基类,内部开发专用
 *****************************************************/

namespace Lib\Cache;

class CoRedis
{

    /**
     * @var \Redis
     */
    public $redis;

    /**
     *
     * CoRedis constructor.
     * @param array $options
     * @throws \Exception
     */
    public function __construct($options = ['groupId' => 0])
    {
        $config = REDIS_CONFIG["REDIS_GROUP_{$options['groupId']}"];

        //redis
        $this->redis = new \Swoole\Coroutine\Redis(['timeout' => $config["timeout"]]);

        //redis host
        $host = $config["host"];

        //redis port
        $port = $config["port"];

        //redis password
        $auth = $config["password"];

        try {

            //connect
            $bCon = $this->redis->connect($host, $port);

            //auth
            if ($auth) {
                $val = $this->redis->auth($auth);
            } else {
                $val = true;
            }

            if (!$bCon || !$val) {
                $this->redis = false;
                recordLog('连接Redis服务器失败或者密码错误！host:' . $host . '，port:' . $port . ', connect: ' . $bCon . ', auth:' . $val, __FILE__, __LINE__, LP_ERROR);
            }

        } catch (\Exception $e) {
            $this->redis = false;
            recordLog('连接Redis服务器失败或者密码错误！host:' . $host . '，port:' . $port);
            throw new \Exception('连接Redis服务器失败或者密码错误！host:' . $host . '，port:' . $port, __FILE__, __LINE__, LP_ERROR);
        }
    }

    /**
     * 析构函数
     * 自动销毁redis连接
     */
    public function __destruct()
    {
        if ($this->redis) {
            unset($this->redis);
        }
    }

    /**
     * 调用redis原生方法，还在测试，千万不要用。
     *
     * @param $method
     * @param $argv
     * @return mixed|null
     * @throws \Exception
     */
//    public function __call($method, $argv)
//    {
//        $result = null;
//        try {
//
//            $mt = strtolower($method);
//
//            //zIncrBy,zadd 第二个参数得是float，不然swoole会crash
//            if (in_array($mt, ['zincrby', 'zadd'])) {
//                $argv[0] = floatval($argv[0]);
//            }
//
//            //第1，2个参数都得是float
//            if (in_array($mt, ['zdeleterangebyscore', 'zremrangebyscore'])) {
//                $argv[0] = floatval($argv[0]);
//                $argv[1] = floatval($argv[1]);
//            }
//
//            $result = call_user_func_array(array($this->redis, $method), $argv);
//            recordLog("Redis debug: func={$method}, argv: " . json_encode($argv) . " result: " . json_encode($result));
//        } catch (\Exception $e) {
//            recordLog("Redis异常 func={$method} exception=" . $e->getMessage() . ' argv: ' . json_encode($argv));
//            throw new \Exception("Redis异常 func={$method} exception=" . $e->getMessage());
//        }
//
//        //特殊返回处理，兼容phpredis
//
//        return $result;
//    }
}

